//===========================================================================================================================
// Cuberry - http://www.cuberry.net
// Copyright (c) 2012
// by Peacequare® - Amir Moussa
//===========================================================================================================================
// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License 
// as published by the Free Software Foundation, either version 3 of the License, or any later version.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated 
// documentation files (the "Software"), to deal in the Software without restriction, including without limitation 
// the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and 
// to permit persons to whom the Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all copies or substantial portions 
// of the Software.
//
// This program is distributed in the hope that it will be useful.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED 
// TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF 
// CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
// DEALINGS IN THE SOFTWARE.
//
// See the GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.
//===========================================================================================================================

using System.Collections.ObjectModel;
using System.Linq;
using P2.Cuberry.Framework.Helper.Configuration;
using P2.Cuberry.Framework.Helper;


namespace P2.Cuberry.Modules.SimpleAccounting.FiCheque.Services
{
    public class FiChequeService : IFiChequeService
    {
        public ObservableCollection<BusinessEntities.FiCheque> RetrieveCheques()
        {
            ObservableCollection<BusinessEntities.FiCheque> cbCheques = new ObservableCollection<BusinessEntities.FiCheque>();
            string connectionString = ConfigurationSetUp.GetEntConnectionString("Business", Properties.Settings.Default.EntityResources);

            using (DAL.FiChequeDataContext db = new DAL.FiChequeDataContext(connectionString))
            {
                var xItems = from xItem in db.FiCheque
                             //orderby xItem.DateOfBirth descending
                             select xItem;
                foreach (var xItemx in xItems)
                    cbCheques.Add(new BusinessEntities.FiCheque(xItemx));
            }
            return cbCheques;
        }

        //Find++
        public ObservableCollection<BusinessEntities.FiCheque> RetrieveCheques(BusinessEntities.FiChequeQuery templateEntity)
        {
            try
            {
                ObservableCollection<BusinessEntities.FiCheque> cbCheques = new ObservableCollection<BusinessEntities.FiCheque>();
                string connectionString = ConfigurationSetUp.GetEntConnectionString("Business", Properties.Settings.Default.EntityResources);
                using (DAL.FiChequeDataContext db = new DAL.FiChequeDataContext(connectionString))
                {
                    IQueryable<DAL.FiCheque> query = db.FiCheque;

                    if (templateEntity.FiscalYearID > -1)
                        query = query.Where(t => t.FiscalYearID == templateEntity.FiscalYearID);
                    
                    if (templateEntity.ChequeNoFrom.HasValue)
                        query = query.Where(t => t.ChequeNo.HasValue && t.ChequeNo.Value >= templateEntity.ChequeNoFrom.Value);
                    if (templateEntity.ChequeNoTo.HasValue)
                        query = query.Where(t => t.ChequeNo.HasValue && t.ChequeNo.Value <= templateEntity.ChequeNoTo.Value);

                    if (!string.IsNullOrEmpty(templateEntity.Bank))
                        query = query.Where(t => t.Bank.ToLower().Contains(templateEntity.Bank.ToLower()));

                    if (!string.IsNullOrEmpty(templateEntity.MyBank))
                        query = query.Where(t => t.MyBank.ToLower().Contains(templateEntity.MyBank.ToLower()));

                    if (templateEntity.ValueDateFrom.HasValue)
                        query = query.Where(t => t.ValueDate.HasValue && t.ValueDate.Value >= templateEntity.ValueDateFrom.Value);
                    if (templateEntity.ValueDateTo.HasValue)
                        query = query.Where(t => t.ValueDate.HasValue && t.ValueDate.Value <= templateEntity.ValueDateTo.Value);
                    if (templateEntity.AmountFrom.HasValue)
                        query = query.Where(t => t.Amount.HasValue && t.Amount.Value >= templateEntity.AmountFrom.Value);
                    if (templateEntity.AmountTo.HasValue)
                        query = query.Where(t => t.Amount.HasValue && t.Amount.Value <= templateEntity.AmountTo.Value);

                    if (templateEntity.CurrencyID > -1)
                        query = query.Where(t => t.CurrencyID == templateEntity.CurrencyID);


                    if (templateEntity.StatusID > -1)
                        query = query.Where(t => t.StatusID == templateEntity.StatusID);
                    //** query = query.OrderByDescending(t => t.DocumentDate); //.ThenBy(a => a.SortingPosition).ThenBy(a => a.FiAccountNameEn);

                    var xItems = from xItem in query
                                 select xItem;
                    //string ChequeNoFromTemplate = null;
                    //if (templateEntity.ChequeNoFrom != null)
                    //    ChequeNoFromTemplate = templateEntity.ChequeNoFrom.PadLeft(18, '0');

                //    string ChequeNoToTemplate =null;
                //    if (templateEntity.ChequeNoTo != null)
                //        ChequeNoToTemplate= templateEntity.ChequeNoTo.PadLeft(18, '0');
                    foreach (var xItem in xItems)
                    {
                //        // filter to ChequeNo has to be done by code, as there is type conversion
                //        if ((string.IsNullOrEmpty(templateEntity.ChequeNoFrom) && string.IsNullOrEmpty(templateEntity.ChequeNoTo))
                //            || (!string.IsNullOrEmpty(templateEntity.ChequeNoFrom) && !string.IsNullOrEmpty(xItem.ChequeNo) && string.Compare(ChequeNoFromTemplate, xItem.ChequeNo.PadLeft(18, '0')) <= 0)
                //            || (!string.IsNullOrEmpty(templateEntity.ChequeNoTo) && !string.IsNullOrEmpty(xItem.ChequeNo) && string.Compare(ChequeNoToTemplate, xItem.ChequeNo.PadLeft(18, '0')) >= 0)
                //            )
                        cbCheques.Add(new BusinessEntities.FiCheque(xItem));
                    }

                }
                return cbCheques;
            }
            catch (System.Exception ex)
            {
                P2ExceptionHandler.LogException(ex, string.Format("{0}.{1}", this.GetType().Name, System.Reflection.MethodInfo.GetCurrentMethod().Name));
                return null;
            }
        }

        public BusinessEntities.FiCheque RetrieveChequeByTransactionItemID(int fiTransactionItemID)
        {
            BusinessEntities.FiCheque retCheque = null;
            if (fiTransactionItemID < -1)
            {
                // when fiTransactionItemID < -1, unsaved item, try to find in temporary storage
                retCheque = BusinessEntities.FiCheque.TemporaryStorage.FirstOrDefault(it => it.FiTransactionID == fiTransactionItemID);
            }
            else
            {
                string connectionString = ConfigurationSetUp.GetEntConnectionString("Business", Properties.Settings.Default.EntityResources);

                using (DAL.FiChequeDataContext db = new DAL.FiChequeDataContext(connectionString))
                {
                    var xItems = from xItem in db.FiCheque
                                 where xItem.FiTransactionID == fiTransactionItemID
                                 select xItem;
                    var dalCheque = xItems.FirstOrDefault();
                    if (dalCheque != null)
                        retCheque = new BusinessEntities.FiCheque(dalCheque);
                }
            }
            return retCheque;
        }

    }
}